14 HTTP的实体数据
数据类型与编码
MIME type:借用邮件中多用途互联网邮件扩展(Multipurpose Internet Mail Extensions)的一部分,把数据分成八大类,每个大类下再细分出多个子类,形式是 type/subtype 的字符串:
- text:文本格式的可读数据,text/html:超文本文档,text/plain:纯文本、text/css:样式表等;
- image:图像文件,image/gif、image/jpeg、image/png 等。
- audio/video:音频和视频数据,audio/mpeg、video/mp4 等。
- application:数据格式不固定,可能是文本也可能是二进制,必须由上层应用程序来解释。application/json,application/javascript、application/pdf 等,不知道数据是什么类型,用 application/octet-stream,即不透明的二进制数据。
传输时为了节约带宽,可以压缩数据,Encoding type 表示数据编码格式。
- gzip:GNU zip 压缩格式,互联网上最流行的压缩格式;
- deflate:zlib(deflate)压缩格式,流行程度仅次于 gzip;
- br:一种专门为 HTTP 优化的新压缩算法(Brotli)。
数据类型使用的头字段
协议为此定义了两个 Accept 请求头字段和两个 Content 实体头字段,用于客户端和服务器进行内容协商。
Accept 字段标记客户端可理解的 MIME type,可以用 , 做分隔符列出多个类型,让服务器有更多的选择:
Accept: text / html, application / xml, image / webp, image / png;
服务器会在响应报文里用头字段 Content-Type 告诉实体数据的真实类型:
Content-Type: text/html
Content-Type: image/png
Accept-Encoding 字段是客户端支持的压缩格式,可以用 , 列出多个,服务器可以选择其中一种来压缩数据,实际使用的压缩格式放在响应头字段 Content-Encoding 里:
Accept-Encoding: gzip, deflate, br
Content-Encoding: gzip
这两个字段可以省略,表示客户端不支持压缩数据或响应数据没有被压缩。
语言类型与编码
解决国际化的问题。
语言类型:人类使用的自然语言,例如英语、汉语、日语等,自然语言可能还有下属的地区性方言,在需要明确区分的时候使用 type-subtype 的形式:
- en:任意的英语
- en-US:美式英语
- en-GB:英式英语
- zh-CN:最常使用的汉语
- 香港:中国香港
字符集:字符编码方式来处理文字的集合:
- 英语的 ASCII
- 汉语的 GBK、BIG5
- 日语的 Shift_JIS
- Unicode 和 UTF-8,把世界上所有的语言都容纳在一种编码方案里,遵循 UTF-8 字符编码方式的 Unicode 字符集成为了互联网上的标准字符集
语言类型使用的头字段
使用 Accept 请求头字段和 Content 实体头字段,用于客户端和服务器就语言与编码进行内容协商。
Accept-Language 字段标记客户端可理解的自然语言,用 , 做分隔符列出多个类型:
Accept-Language: zh-CN, zh, en
服务器在响应报文里用头字段 Content-Language 告诉客户端实体数据使用的实际语言类型:
Content-Language: zh-CN
字符集使用 Accept-Charset 字段标记,响应头里对应的是 Content-Type 字段,用 charset=xxx 来表示:
Accept-Charset: gbk, utf-8
Content-Type: text/html; charset=utf-8
使用的语言可以由字符集推断出来,请求头里一般只会有 Accept-Language 字段,响应头里只会有 Content-Type 字段。
内容协商的质量值
协议里用 Accept、Accept-Encoding、Accept-Language 等请求头字段进行内容协商时,可以用一种特殊的 q(quality factor)参数表示权重来设定优先级。
权重范围是 0.01~1,默认 1,0 表示拒绝。在数据类型或语言代码后面加一个 ; ,然后是 q=value :
Accept: text/html,application/xml;q=0.9,*/*;q=0.8
HTML 文件权重是 1,XML 文件权重是 0.9,任意数据类型权重是 0.8。服务器收到请求头后,会计算权重,再根据自己的实际情况优先输出 HTML 或者 XML。
内容协商的结果
Web 服务器在内容协商时使用的算法都不一样。服务器会在响应头里多加一个 Vary 字段,记录服务器在内容协商时参考的请求头字段:
Vary: Accept - Encoding, User - Agent, Accept;
这个 Vary 字段表示服务器依据了 Accept-Encoding、User-Agent 和 Accept 这三个头字段,然后决定了发回的响应报文。Accept 等请求头变化时,Vary 会一起变化。即同一个 URI 可能会有多个不同的版本,主要用在传输链路中间的代理服务器实现缓存服务。